package com.tong.hao.ac.api.feign.hystrix;

import com.tong.hao.ac.api.feign.query.IQueryUserInfoFeign;
import com.tong.hao.ac.api.model.in.query.QueryUserInfoIn;
import com.tong.hao.ac.api.model.out.query.QueryUserInfoOut;
import feign.hystrix.FallbackFactory;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

/**
 * @ClassName QueryUserInfoFallbackFactory
 * @Author 友野浩二
 * @Description hystrix熔断器: 回调实现类,需要实现FeignClient接口
 * @Version 1.0
 *
 * <pre>
 *     1- 雪崩效应:
 *          多个微服务之间进行复杂通信时，如果有一个服务出现问题，就会引发雪崩效应，导致整个系统瘫痪。
 *          SpringCloud Hystrix提供了一个类似于保险丝的作用，当服务不可用的时候，hystrix打开断路器，不再进行服务通信，从而保证自身服务的可用性，提高系统的高可用性。
 *     2- 服务降级(fallback)
 *          服务降级就是在系统高并发的情况下，可以将一些边缘服务进行降级(服务暂停)，将资源优先提供给核心服务处理。
 *     熔断器只是作用在服务消费者一端，feign中已经依赖了hystrix，所以maven配置不作任何改动。
 *
 *     当IQueryUserInfoFeign中的feign调用失败或超时的时候，会调用该实现类的方法。
 *
 *     通过FallbackFactory能够检查回退原因，该类需实现FallbackFactory接口，并覆写create方法。
 * </pre>
 */
@Component
@Slf4j
public class QueryUserInfoFallbackFactory implements FallbackFactory<IQueryUserInfoFeign> {

    @Override
    public IQueryUserInfoFeign create(Throwable throwable) {
        return new IQueryUserInfoFeign() {
            @Override
            public QueryUserInfoOut queryUserInfo(QueryUserInfoIn queryUserInfoIn) {
                // 打印异常信息
                log.info("FallbackFactory: 服务消费者调用AC模块的/query/user/info服务失败! reason was: {}", throwable);
                return new QueryUserInfoOut();
            }
        };
    }
}
